package com.zxl.designpattern.structure.proxy;

import net.sf.cglib.proxy.Enhancer;

/**
 * @author zxl
 * @version 1.0
 * @description CGLIB代理工厂，创建代理对象
 *  CGLIB（Code Generation Library）是一个开源的、基于ASM（Java字节码操作库）的字节码生成库，用于在运行时动态生成类和方法。
 *  CGLIB通过继承目标类来生成代理类，因此它可以代理非接口实现的类。
 *  CGLIB的主要优点包括：
 *  1. 支持非接口实现的类：CGLIB可以代理非接口实现的类，从而实现对真实对象的保护和增强。
 *  2. 性能高：CGLIB的性能比JDK动态代理高，因为CGLIB是通过继承目标类来生成代理类的。
 *  3. 支持方法拦截：CGLIB支持方法拦截，从而实现对真实对象的访问控制和增强。
 *  CGLIB的主要缺点包括：
 *  1. 无法代理final类：CGLIB无法代理final类，因为final类不能被继承。
 *  2. 无法代理final方法：CGLIB无法代理final方法，因为final方法不能被重写。
 *  3. 无法代理private方法：CGLIB无法代理private方法，因为private方法不能被访问。
 *  CGLIB的主要应用场景包括：
 *  1. 远程访问：CGLIB可以实现远程访问，从而实现分布式系统的开发。
 *  2. 延迟加载：CGLIB可以延迟对象的创建，从而提高系统的性能。
 *  3. 访问控制：CGLIB可以控制对真实对象的访问，从而实现对真实对象的保护和增强。
 *  CGLIB的主要实现方式包括：
 *  1. Enhancer：Enhancer是CGLIB的主要类，用于生成代理类。
 *  2. Callback：Callback是CGLIB的回调接口，用于实现方法拦截。
 *  3. CallbackFilter：CallbackFilter是CGLIB的回调过滤器，用于过滤方法拦截。
 *  4. CallbackHandler：CallbackHandler是CGLIB的回调处理器，用于处理方法拦截。
 *  5. MethodInterceptor：MethodInterceptor是CGLIB的方法拦截器，用于实现方法拦截。
 *  6. MethodProxy：MethodProxy是CGLIB的方法代理，用于调用真实对象的方法。
 *  7. MethodInterceptor：MethodInterceptor是CGLIB的方法拦截器，用于实现方法拦截。
 * @date 2025/6/1 15:25
 */
public class CglibProxyFactory {

    /**
     * 创建代理对象
     * @param targetClass
     * @param args
     * @return
     * @param <T>
     */
    public static <T> T createProxy(Class<T> targetClass, Object... args) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(targetClass);
        enhancer.setCallback(new CarPurchaseInterceptor());

        // 如果有构造参数，传入构造参数
        if (args != null && args.length > 0) {
            Class[] types = new Class[args.length];
            for (int i = 0; i < args.length; i++) {
                types[i] = args[i].getClass();
            }
            return (T) enhancer.create(types, args);
        }
        return (T) enhancer.create();
    }
}
